package gf

import (
	"io"
	"os"
)

// Copy 实现了 FileMan 的文件复制功能。
// 它打开源文件和目标文件，并将源文件的内容复制到目标文件中。
func (api *FileMan) Copy() {
	// 打开源文件
	api.fileSrc, api.Err = os.Open(api.Src)
	if api.Err != nil {
		return
	}
	// 确保源文件在函数结束时关闭
	defer func(Src *os.File) {
		err := Src.Close()
		if err != nil {
			return
		}
	}(api.fileSrc)

	// 创建目标文件
	api.fileDst, api.Err = os.Open(api.Dst)
	if api.Err != nil {
		return
	}
	// 确保目标文件在函数结束时关闭
	defer func(Dst *os.File) {
		err := Dst.Close()
		if err != nil {
			return
		}
	}(api.fileDst)

	// 复制文件流
	_, api.Err = io.Copy(api.fileDst, api.fileSrc)
	if api.Err != nil {
		return
	}
}

// Copy 函数将源文件从src路径复制到dst路径。
// 它使用FileMan实例来执行复制操作并处理任何可能发生的错误。
// 参数:
//
//	src - 源文件的路径。
//	dst - 目标文件的路径。
//
// 返回值:
//
//	如果复制过程中发生错误，则返回该错误；否则返回nil。
func Copy(src, dst string) error {
	// 创建一个FileMan实例，用于处理文件复制操作。
	f := NewFileMan(src, dst)

	// 调用实例的Copy方法执行文件复制。
	f.Copy()

	// 返回可能发生的错误，如果没有错误，则返回nil。
	return f.Err
}

// Move 方法用于移动文件或目录。
// 通过封装 os.Rename 方法，实现将源路径（api.Src）的文件或目录移动到目标路径（api.Dst）。
// 此方法简单地调用了 os 包的 Rename 函数，因此没有复杂的逻辑需要解释。
// 注意：错误处理（if api.Err != nil {...}）在该方法外部进行。
func (api *FileMan) Move() {
	api.Err = os.Rename(api.Src, api.Dst)
}

// Move 函数将文件从一个路径移动到另一个路径。
// 参数：
//   - src: 源文件的路径，例如："path/to/source/file.txt"
//   - dst: 目标文件的路径，例如："path/to/destination/file.txt"
//
// 返回值：
//   - 如果移动操作成功，返回nil。
//   - 如果移动操作失败，返回相应的错误信息。
func Move(src, dst string) error {
	// 创建一个FileMan实例，用于处理文件移动操作。
	f := NewFileMan(src, dst)

	// 调用FileMan实例的Move方法执行文件移动。
	f.Move()
	// 返回移动操作中可能发生的错误，如果没有错误，则返回nil。
	return f.Err
}
